package com.coder.rental.security;

import com.coder.rental.entity.User;
import com.coder.rental.service.IUserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

@Component
public class CustomerUserDetailsService implements UserDetailsService {

    @Resource
    private IUserService userService;

    // spring security配置中登录使用
    // 通过username-实现用户登录信息查询 UserDetails-放登录认证成功后获取到的用户信息
    // 如果用户名存在，loadUserByUsername 方法返回一个实现了 UserDetails 接口的对象，通常是一个包含用户名、密码和用户权限等信息的用户对象
    // 当 loadUserByUsername 方法返回 UserDetails 对象时，Spring Security 会获取用户对象中的密码字段，并使用 PasswordEncoder 的 matches 方法将用户输入的密码（rawPassword）与数据库中存储的加密密码（encodedPassword）进行比对。
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.selectByUsername(username); // 到数据库中按username去查询
        if(user == null) {
            throw new UsernameNotFoundException("用户不存在"); // ss的异常
        }
        // spring security找到UserDetailsService，调用里面loadUserByUsername方法，如果方法抛异常，重定向到/login?error，表示用户名不存在，登录失败。
        // 如果方法没有抛异常，调用PasswordEncoder接口（由CustomerPasswordEncoder实现）matches方法，校验返回值中保存的密码和请求参数的密码是否匹配，如果为true，则登录成功，否则登录失败

        // 查询用户权限列表
        // todo
        return user;
    }
}
